/*
 * Copyright (C) 2011 The Android Open Source Project
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */

package com.android.volley.toolbox;

import java.util.TreeMap;

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;

/**
 * A request for retrieving a T type response body at a given URL that also optionally sends along a
 * JSON body in the request specified.
 * 
 * @param <T> JSON type of response expected
 */
public abstract class JsonRequest<T> extends Request<T> {
    private final TreeMap<String, String> mParams = new TreeMap<String, String>();
    /** Charset for request. */
    // private static final String PROTOCOL_CHARSET = "utf-8";

    /** Content type for request. */
    // private static final String PROTOCOL_CONTENT_TYPE =
    // String.format("application/json; charset=%s",
    // PROTOCOL_CHARSET);

    private final Listener<T> mListener;

    // private final String mRequestBody;

    /**
     * Deprecated constructor for a JsonRequest which defaults to GET unless {@link #getPostBody()}
     * or {@link #getPostParams()} is overridden (which defaults to POST).
     * 
     * @deprecated Use {@link #JsonRequest(int, String, String, Listener, ErrorListener)}.
     */
    @Deprecated
    public JsonRequest(String url, String requestBody, Listener<T> listener,
            ErrorListener errorListener) {
        this(Method.DEPRECATED_GET_OR_POST, url, requestBody, listener, errorListener);
    }

    public JsonRequest(int method, String url, String requestBody, Listener<T> listener,
            ErrorListener errorListener) {
        super(method, url, errorListener);
        mListener = listener;
        // mRequestBody = requestBody;
    }

    public JsonRequest(int method, String url, Listener<T> listener, ErrorListener errorListener) {
        super(method, url, errorListener);
        mListener = listener;
        // mRequestBody = null;
    }

    @Override
    protected void deliverResponse(T response) {
        mListener.onResponse(response);
    }

    @Override
    abstract protected Response<T> parseNetworkResponse(NetworkResponse response);

    /**
     * @deprecated Use {@link #getBodyContentType()}.
     */
    @Deprecated
    @Override
    public String getPostBodyContentType() {
        return getBodyContentType();
    }

    // /**
    // * @deprecated Use {@link #getBody()}.
    // */
    /*
     * @Deprecated
     * 
     * @Override public byte[] getPostBody() { return getBody(); }
     * 
     * @Deprecated
     * 
     * @Override public String getBodyContentType() { return PROTOCOL_CONTENT_TYPE; }
     * 
     * @Override public byte[] getBody() { try { return mRequestBody == null ? null :
     * mRequestBody.getBytes(PROTOCOL_CHARSET); } catch (UnsupportedEncodingException uee) {
     * VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",
     * mRequestBody, PROTOCOL_CHARSET); return null; } }
     */

    public void addParams(String key, String value) {
        mParams.put(key, value);
    }

    public void addParams(String key, int value) {
        mParams.put(key, String.valueOf(value));
    }

    public void addParams(String key, double value) {
        mParams.put(key, String.valueOf(value));
    }

    public void addParams(String key, float value) {
        mParams.put(key, String.valueOf(value));
    }

    @Override
    public TreeMap<String, String> getParams() throws AuthFailureError {
        return mParams;
    }
}
